package main

import (
	"crypto/md5"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"github.com/gogf/gf/g/encoding/gurl"
	"github.com/gogf/gf/g/util/gconv"
)

//其中，url为用户在页面配置时填写的URL，nonce、msg、signature用于URL及token的验证
//
//token验证过程如下：
//
//将配置页面中配置的token与nonce、msg的值计算MD5，并且编码为Base64字符串值
//
//将上一步中Base64字符串值通过URL Decode计算后的值与请求参数signature的值进行对比，如果相等则表示token验证成功
//
//如果token验证成功，返回msg参数值，表示URL验证通过。
type Msg struct {
	At int `json:"at"`
	LoginType int `json:"login_type"`
	Imei string `json:"imei"`
	Type int `json:"type"`
	DevId int `json:"dev_id"`
	Status int `json:"status"`
}

type Data struct {
	Msg Msg `json:"msg"`
	MsgSignature  string  `json:"msg_signature"`
	Nonce string `json:"nonce"`
}

func main() {
	jsonStr:=`{"msg":{"at":1545084087986,"login_type":10,"imei":"865820034803473","type":2,"dev_id":503937408,"status":1},"msg_signature":"0/Wp/sBEVGlFq8RYeUToXQ==","nonce":"32v%ra95"}`
	var data Data
	err:=json.Unmarshal([]byte(jsonStr), &data)
	if err!=nil{
		//log.Fatalf()
		fmt.Println("err=====",err)
		return
	}
	fmt.Println(data.Msg)
	token:="0535deer"
	msgStr:=gconv.String(data.Msg)
	nonce:=data.Nonce
	fmt.Println("token+nonce+msgStr============",token+nonce+msgStr)
	md5s :=MD5Encrypt(token+nonce+msgStr)
	println("md5s====", md5s)
	md5B64:=base64.StdEncoding.EncodeToString(md5s)
	println("md5B64====",gconv.String(md5B64))
	if md5url,err:=gurl.Decode(md5B64);err==nil{
		println("md5url====",md5url)
	}else {
		println("err====",err)
	}
}

func MD5Encrypt(paramStr string) []byte {
	h := md5.New()
	h.Write([]byte(paramStr))
	return h.Sum(nil)
}
